﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;

namespace MapApp
{
    public partial class Form1 : Form
    {
        MyMap map = new MyMap(new Picture((Image)MapApp.Properties.Resources.MapImage));

        private Func<Bitmap, int[,], int, Bitmap> ProcessImageFunc;
        public Form1()
        {
            InitializeComponent();
        }

        //добавление объекта на карту
        private void bttnAddPoint_Click(object sender, EventArgs e)
        {
            try
            {
                //очистка
                picBox.Image = null;
                picBox.Update();
                //добавление объекта
                map.AddPoint(new Point(int.Parse(txtXPoint.Text), int.Parse(txtYPoint.Text), txtNamePoint.Text));
                //отрисовка карты
                map.Draw(picBox);
            }
            catch (FormatException ex)
            {
                MessageBox.Show("Ooooops FormatException!");
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        //вывод значения метода ToString карты
        private void bttnMapToString_Click(object sender, EventArgs e)
        {
            txtToString.Text = map.ToString();
        }

        #region примеры для проверки операций с классом карт

        private void TestSum()
        {
            MyMap map1 = new MyMap();
            MyMap map2 = new MyMap();
            map1.AddPoint(new Point(2, 3, "knkn"));
            map2.AddPoint(new Point(3, 4, "fihi"));
            txtToString.Text = (map1 + map2).ToString();
            txtToString.Invalidate();
        }

        private void TestRas()
        {
            MyMap map1 = new MyMap();
            MyMap map2 = new MyMap();
            map1.AddPoint(new Point(2, 3, "knkn"));
            map1.AddPoint(new Point(3, 4, "knkn"));
            map2.AddPoint(new Point(2, 3, "fihi"));
            txtToString.Text = (map1 - map2).ToString();
            txtToString.Invalidate();
        }

        #endregion

        //отрисовка карты при загрузке формы
        private void Form1_Load(object sender, EventArgs e)
        {
            map.Draw(picBox);
        }

        //негатив изображения
        private void bttnNegative_Click(object sender, EventArgs e)
        {
            ThreadPool.QueueUserWorkItem(new WaitCallback((s) => { map.SetImage(new Bitmap(map.GetImage()), new int[,] { { 0 } }, 0, MyFilters.negativeFilter); map.Draw(picBox);}));

        }

        //увеличить резкость изображения
        private void bttnSharpen_Click_1(object sender, EventArgs e)
        {
            ThreadPool.QueueUserWorkItem(new WaitCallback((s) =>
            {
                map.SetImage(new Bitmap(map.GetImage()), new int[,] { { 0, -2, 0 }, { -2, 11, -2 }, { 0, -2, 0 } }, 0, MyFilters.Filter);
                map.Draw(picBox);
            }));
            
        }

        //размытие изображения
        private void bttnBlur_Click(object sender, EventArgs e)
        {
            ThreadPool.QueueUserWorkItem(new WaitCallback((s) =>
            {
                map.SetImage(new Bitmap(map.GetImage()), new int[,] { { 1, 2, 1 }, { 2, 4, 2 }, { 1, 2, 1 } }, 0, MyFilters.Filter);
                map.Draw(picBox);
            }));
            
        }

    }
}
